/*
 * @LastEditors: yuSeen
 * @LastEditTime: 2021-12-04 18:06:06
 * 天凉好个秋
 */
import Resource from "../model/resource";
import Role from "../model/role";
import User_Role from "../model/user-role";

class Permission {

  // 获取用户对应的角色列表
  getUserRole(userId: number) {
    return User_Role.findAll({
        where: {
            user_id: userId
        }
    })
  }

  // 获取所有角色资源列表
  roleResourceList() {
    return Resource.findAll({
      include: {
        attributes: ['id', 'name'],
        model: Role
      }
    });
  }

  /**
   * @description: 校验是否有权限
   * @param {number} userId 用户id
   * @param {string} resource 请求资源
   * @param {*} allRoleResourcList  角色资源列表
   * @return {boolean} 是否有权限
   */  
  async verifPermission(userId: number | boolean, resource: string, allRoleResourcList = []): Promise<boolean> {
        
    // 用拥有的角列表
    let userRole = []
    // 若用户id为false，则视为未登录，赋予角色游客相关的权限(角色表中游客的id为3)
    if(userId === false) {
      userRole = [3]
    } else {
      userRole = (await this.getUserRole(userId as number)).map(item => item["dataValues"].role_id)
    }
    // 当前访问的资源地址
    const realResourceName = '/' + resource.split('/')[1]
    // 有权限访问当前资源的角色列表
    const currentResourcRoles = allRoleResourcList.find(item => item.url === realResourceName).roles.map(item => item.id)

    // 判断当前用户的角色与有权限访问当前资源的角色列表是否有交集，若有交集则证明有权限访问当前资源，反之则无权限
    const hasPermission = userRole.length + currentResourcRoles.length !== new Set([...userRole, ...currentResourcRoles]).size;
    
    return hasPermission
  }
}

export default new Permission();
